<?php
declare (strict_types=1);

namespace app\model\user;

use think\Model;
use think\facade\Request;
use crmeb\basic\BaseModel;
use crmeb\traits\ModelTrait;
use crmeb\traits\JwtAuthModelTrait;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
use think\model\relation\BelongsTo;
use think\model\relation\BelongsToMany;


/**
 * @property float $balance 余额
 * @property float $exp 会员经验
 * @property int $birthday 生日
 * @property int $coin 金币
 * @property int $last_login_time 最后登录时间
 * @property int $level 等级
 * @property int $pay_count 用户购买次数
 * @property int $pid 上级
 * @property int $score 用户积分
 * @property int $sex 性别;0:保密,1:男,2:女
 * @property int $spread_count 下级人数
 * @property int $user_status 用户状态;0:禁用,1:正常,2:未验证
 * @property int $user_type 用户类型;1:admin;2:普通用户 3:会员用户
 * @property string $avatar 用户头像
 * @property string $bank_card 默认支付银行卡号码
 * @property string $bind_time 绑定推荐时间
 * @property string $card_id 身份证号
 * @property string $create_time 注册时间
 * @property string $eid_token
 * @property string $id
 * @property string $last_login_ip 最后登录ip
 * @property string $make_code 推广码
 * @property string $mobile 中国手机不带国家代码，国际手机号格式为：国家代码-手机号
 * @property string $more 扩展属性
 * @property string $name 姓名
 * @property string $openid 微信小程序openid
 * @property string $signature 个性签名
 * @property string $trade_password 交易密码
 * @property string $updated_at 修改时间
 * @property string $user_activation_key 激活码
 * @property string $user_email 用户登录邮箱
 * @property string $user_login 用户名
 * @property string $user_nickname 用户昵称
 * @property string $user_pass 登录密码;cmf_password加密
 * @property string $user_url 用户个人网址
 * @property-read \app\model\user\User $parent_info
 * @property-read \app\model\user\UserToken[] $user_token
 * @property-read array $avatar_list
 */
class User extends BaseModel
{
    use ModelTrait;
    use JwtAuthModelTrait;

    /**
     * 数据表主键
     * @var string
     */
    protected $pk = 'id';

    /**
     * 模型名称
     * @var string
     */
    protected $name = 'user';

    use ModelTrait;

    protected $autoWriteTimestamp = true;
    protected $createTime = 'create_time';
    protected $updateTime = false;


    // 设置字段自动转换类型
    protected $type = [
//        'id' => 'integer',
//        'id' => 'strval',
        'bind_time' => 'timestamp:Y-m-d H:i:s', // 绑定推荐时间
        'activity_buy_time' => 'timestamp:Y-m-d H:i:s', // 首次购买一元盲盒的时间
    ];

    /**
     * @param Model $query
     * @param $value
     */
    public function searchIdAttr($query, $value)
    {
        if ($value) {
            $query->where('id', 'in', $value);
        }
    }

    /**
     * @param Model $query
     * @param $value
     */
    public function searchPromoteTeamIdAttr($query, $value)
    {
        if ($value) {
            $query->where('promote_team_id', 'in', $value);
        }
    }

    /**
     * @param Model $query
     * @param $value
     */
    public function searchLikeAttr($query, $value)
    {
        if ($value && $value != '') {
            $query->where('mobile|name', 'like', "%$value%");
        }
    }

    /**
     * @param Model $query
     * @param $value
     */
    public function searchDurationAttr($query, $value)
    {
        if ($value) {
            $query->where('create_time', 'between', $value);
        }
    }


    /**
     * @param Model $query
     * @param $value
     */
    public function searchPidAttr($query, $value)
    {
        if ($value) {
            $query->where('pid', 'in', $value);
        }
    }

    /**
     * 用户类型;1:admin;2:普通用户 3:会员用户
     * @param Model $query
     * @param $value
     */
    public function searchUserTypeAttr($query, $value)
    {
        if ($value) {
            $query->where('user_type', 'in', $value);
        }
    }

    /**
     * bind_time_egt 绑定推荐时间 大于等于多少
     * @param Model $query
     * @param $value
     */
    public function searchBindTimeEgtAttr($query, $value)
    {
        if ($value) {
            $query->where('bind_time', '>=', $value);
        }
    }

    /**
     * spread_count_egt 下级人数 大于等于多少
     * @param Model $query
     * @param $value
     */
    public function searchSpreadCountEgtAttr($query, $value)
    {
        if ($value) {
            $query->where('spread_count', '>=', $value);
        }
    }


    /**
     * 性别;0:保密,1:男,2:女
     * @param Model $query
     * @param $value
     */
    public function searchSexAttr($query, $value)
    {
        $query->where('sex', $value);
    }

    /**
     * 用户状态;0:禁用,1:正常,2:未验证
     * @param Model $query
     * @param $value
     */
    public function searchUserStatusAttr($query, $value)
    {
        if ($value && $value != '') {
            $query->where('user_status', $value);
        }
    }

    /**
     * 用户名
     * @param Model $query
     * @param $value
     */
    public function searchUserLoginAttr($query, $value)
    {
        if ($value) {
            $query->whereLike('user_login', "%$value%");
        }
    }

    /**
     * 用户昵称
     * @param Model $query
     * @param $value
     */
    public function searchUserNicknameAttr($query, $value)
    {
        if ($value) {
            $query->whereLike('user_nickname', "%$value%");
        }
    }

    /**
     * 姓名
     * @param Model $query
     * @param $value
     */
    public function searchNameAttr($query, $value)
    {
        if ($value) {
            $query->whereLike('name', "%$value%");
        }
    }

    /**
     * 模糊关键字搜索
     * @param Model $query
     * @param $value
     */
    public function searchDescriptionAttr($query, $value)
    {
        if ($value) {
            $query->where('name|user_nickname|mobile', 'like', "%$value%");
        }
    }

    /**
     * 绑定时间区间
     * @param Model $query
     * @param $value
     */
    public function searchBindTimeAttr($query, $value)
    {
        if ($value) {
            $query->where('bind_time', '>=', $value[0] / 1000)->where('bind_time', '<', ($value[1] / 1000) + 86400);
        }
    }

    /**
     * 用户登录邮箱
     * @param Model $query
     * @param $value
     */
    public function searchUserEmailAttr($query, $value)
    {
        if ($value) {
            $query->whereLike('user_email', "%$value%");
        }
    }

    /**
     * 身份证号
     * @param Model $query
     * @param $value
     */
    public function searchCardIdAttr($query, $value)
    {
        if ($value) {
            $query->where('card_id', $value);
        }
    }

    /**
     * 中国手机不带国家代码，国际手机号格式为：国家代码-手机号
     * @param Model $query
     * @param $value
     */
    public function searchMobileAttr($query, $value)
    {
        if ($value) {
            $query->where('mobile', $value);
        }
    }

    /**
     * 推广码
     * @param Model $query
     * @param $value
     */
    public function searchMakeCodeAttr($query, $value)
    {
        if ($value) {
            $query->where('make_code', $value);
        }
    }

    /**
     * @param $id
     * @return string
     */
    public function getIdAttr($id): string
    {
        return strval($id);
    }

    /**
     * @param $card_id
     * @return string
     */
    public function getCardIdAttr($card_id): string
    {
        return strval($card_id);
    }

    /**
     * @param $avatar
     * @return string
     */
    public function getAvatarAttr($avatar): string
    {
        if (empty($avatar)) {
            return Request::instance()->domain() . '/static/images/headicon.png';
        }
        return $avatar;
    }

    /**
     * @param $value
     * @param $data
     * @return array
     */
    public function getAvatarListAttr($value, $data): array
    {
        if ($data['avatar']) {
            return [$data['avatar']];
        }
        return [Request::instance()->domain() . '/static/images/headicon.png'];
    }

    /**
     * 上级推荐人信息
     * 自关联
     * @return HasOne
     */
    public function parentInfo(): HasOne
    {
        return $this->hasOne(User::class, 'id', 'pid');
    }

    /**
     * @return HasMany
     */
    public function userToken(): HasMany
    {
        return $this->hasMany(UserToken::class, 'user_id', 'id');
    }
}
